package net.comfycastle.musicplayer;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;

/**
 * 음악 재생 상태 UI를 제공하는 프래그먼트
 * @author ricale
 *
 */
public class PlayStateFragment extends BaseGeneralFragment{
	///////////
	//////////
	/////////   variable
	
	/** 재생 진행 상태를 표시하는 싴바 */
	private SeekBar mSeekBar;
	/** 읨의 재생 버튼. 추후에 Button이 아닌 다른 클래스로 변경할 예정이다. */
	private Button mRandom;
	/** 반복 재생 버튼. 추후에 Button이 아닌 다른 클래스로 변경할 예정이다. */
	private Button mRepeat;
	
	/** 싴바 실시간 업데이트를 위한 핸들러 */
	private NoLeakHandler mSeekBarHandler;
	
	private ImageView mIvArt;
	
	private TextView mTvRandom;
	private TextView mTvRepeat;
	
	private AlbumArtManager mArtManager;
	
	///////////
	//////////
	/////////   lifecycle callback method
	
	/**
	 * 프래그먼트 생성 시의 콜백 메서드
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	} // end onCreate
	
	/**
	 * 프래그먼트가 액티비티에 붙을 때의 콜백 메서드
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.playstate, container, false);
		mSeekBar = (SeekBar)view.findViewById(R.id.playstate_seekbar);
		mRandom = (Button)view.findViewById(R.id.playstate_random);
		mRepeat = (Button)view.findViewById(R.id.playstate_repeat);
		
		mSeekBar.setOnSeekBarChangeListener(mOnSeekBarChange);
		mSeekBarHandler = new NoLeakHandler(mSeekBar);
	    
	    mRandom.setOnClickListener(mClickListener);
	    mRepeat.setOnClickListener(mClickListener);
	    
	    mIvArt = (ImageView)view.findViewById(R.id.playstate_albumart);
	    
	    mTvRandom = (TextView)view.findViewById(R.id.playstate_testrandomstate);
		mTvRepeat = (TextView)view.findViewById(R.id.playstate_testrepeatstate);
		
		mArtManager = new AlbumArtManager(getActivity());
		mArtManager.setSize(AlbumArtManager.SIZE.BIG);
		
		return view;
	} // end onCreateView
	
	/**
	 * 프래그먼트가 활성화될 때의 콜백 메서드
	 */
	@Override
	public void onResume() {
		super.onResume();
		mSeekBarHandler.on();
		
		IntentFilter filter = new IntentFilter();
		filter.addAction(MPApp.BR_MEDIAPLAYER_PREPARE);
		getActivity().registerReceiver(mMPReadyBr, filter);
		
		updateState();
	} // end onResume
	
	/**
	 * 프래그먼트가 비활성화될 때의 콜백 메서드
	 */
	@Override
	public void onPause() {
		super.onPause();
		mSeekBarHandler.off();
		
		getActivity().unregisterReceiver(mMPReadyBr);
	} // end onPause
	
	///////////
	//////////
	/////////   method
	
	/**
	 * 싴바를 초기화한다.
	 */
	public void initSeekBar() {
		mSeekBar.setMax(MusicUtility.getDuration());
	} // end initSeekBar
	
	public void updateState() {
		String random;
		if(MusicUtility.isRandom()) {
			random = " random, ";
		} else {
			random = " regular order, ";
		}
		mTvRandom.setText(random);
		
		String repeat;
		switch(MusicUtility.getRepeatState()) {
		case ONE:
			repeat = "repeat one song.";
			break;
		case LIST:
			repeat = "repeat playlist.";
			break;
		case NONE: default:
			repeat = "no repeat.";
			break;
		}
		mTvRepeat.setText(repeat);
	}
	
	///////////
	//////////
	/////////   event listener & callback method
	
	/**
	 * 싴바가 변경될 때의 이벤트 리스너
	 */
	SeekBar.OnSeekBarChangeListener mOnSeekBarChange = new SeekBar.OnSeekBarChangeListener() {
		/**
		 * 싴바가 변경되었을 때의 콜백 메서드
		 */
		@Override
		public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
			if(fromUser) {
				MusicUtility.seekTo(progress);
			} // end if
		} // end onProgressChanged
		
		/**
		 * 시크바 탐색 버튼을 터치하기 시작했을 때의 콜백 메서드
		 */
		@Override
		public void onStartTrackingTouch(SeekBar seekbar) {
			MusicUtility.setWasPlaying();
			if(MusicUtility.wasPlaying()) {
				MusicUtility.pause();
			} // end if
		} // end onStartTrackingTouch
		
		/**
		 * 시크바 탐색 버튼의 터치가 끝났을 때의 콜백 메서드
		 */
		@Override
		public void onStopTrackingTouch(SeekBar seekbar) {
			
		} // end onStopTrackingTouch
	}; // end mOnSeekBarChange
	
	/**
	 * 버튼(임의 재생, 반복 재생)이 눌렸을 때의 이벤트 리스너
	 */
	private final View.OnClickListener mClickListener = new View.OnClickListener() {
		/**
		 * 버튼(임의 재생, 반복 재생)이 눌렸을 때의 콜백 메서드
		 */
		@Override
		public void onClick(View v) {
			switch(v.getId()) {
			case R.id.playstate_random:
				MusicUtility.toggleRandom();
				updateState();
				break;
			case R.id.playstate_repeat:
				MusicUtility.toggleRepeat();
				updateState();
				break;
			} // end switch
		} // end onClick
	}; // end mClickListener
	
	///////////
	//////////
	/////////   broadcast receiver
	
	/**
	 * 음악 재생이 정상적으로 완료되었을 때 재생된 노래의 정보를 담은 방송을 듣는 리시버
	 */
	BroadcastReceiver mMPReadyBr = new BroadcastReceiver() {
		/**
		 * 음악 재생 시작이 정상적으로 완료되었을 때 재생된 노래의 정보를 담은 방송을 듣는 콜백 메서드
		 */
		public void onReceive(Context context, Intent intent) {
			initSeekBar();
			long albumId = intent.getLongExtra(MPApp.ITT_ALBUMID, 0l);
			if(albumId != 0){
				mArtManager.requestAlbumArt(mIvArt, albumId);
			} // end if
		} // end onReceive
	}; // mMPReadyBr
	
	///////////
	//////////
	/////////   inner class
	
	/**
	 * 노래 재생에 따른 싴바 실시간 업데이트를 위한 핸들러
	 *
	 */
	private static class NoLeakHandler extends Handler {
		/** 업데이트될 싴바 */
		private SeekBar sb;
		/** 핸들러가 반복적으로 호출되어야 하는가 */
		private boolean isRepeat;
		
		/**
		 * 생성자
		 * @param a 어플리케이션 객체
		 * @param s 업데이트될 싴바
		 */
		NoLeakHandler(SeekBar s) {
			sb  = s;
			isRepeat = false;
		} // end NoLeakHandler
		
		/**
		 * 핸들러의 반복적 호출을 설정한다.
		 */
		public void on() {
			isRepeat = true;
			sendEmptyMessage(0);
		} // end on
		
		/**
		 * 핸들러의 반복적 호출을 해제한다.
		 */
		public void off() {
			isRepeat = false;
		} // end off
		
		/**
		 * 핸들러 본체
		 */
		public void handleMessage(Message msg) {
			Log.i("SEEKHANDLE", "called");
			if(!MusicUtility.isReady()) {
				return;
			} // end if

			if(MusicUtility.isPlaying()) {
				sb.setProgress(MusicUtility.getProgress());
			} // end if
			
			if(isRepeat) {
				sendEmptyMessageDelayed(0, 200);
			} // end if
		} // end handleMessage
	} // end NoLeakHandler
} // end PlayStateFragment